package com.orm.handler;


import com.orm.mapping.MapperStatement;
import lombok.extern.slf4j.Slf4j;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.*;

// 对sql 入参数进行简单处理，仅仅是替换为?
@Slf4j
@Deprecated
public class ParameterHandler {
	private static final String regex = "#\\{.*?\\}";
	
	public static String parseOgnl(String sql) {
		return sql.replaceAll(regex, "?");
	}
	
	public static void setParameters(PreparedStatement ps, Object[] args) {
		try {
			if (args != null) {
				for (int i = 0; i < args.length; i++) {
					ps.setObject(i + 1, args[i]);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 应该直接用 正则处理替换？？？？？？？？
	 *
	 * @param ps
	 * @param sql
	 * @param parametersMap
	 */
	
	//   #{user}     前面可以是空格或者,逗号或者=  后面可以是空格，逗号或者结束或者换行     中间内部内容不能有 #{
	public static void setParameters(PreparedStatement ps, String sql, Map<String, Object> parametersMap) {
		char[] chars = sql.toCharArray();
		
		StringBuilder builder = new StringBuilder();
		
		for (int i = 0; i < chars.length; i++) {
			char c = chars[i];
			if (c == '#' && chars[i + 1] == '{') {
				i += 2;  // 移动到 { 后面去
				int parameterIndex = getParameterIndex(chars, i);
				
				String substring = sql.substring(i, parameterIndex).trim();
				System.out.println(substring);
				
				Object obj = parametersMap.get(substring);
				
				
				// builder.append(" ? ");
				
			} else {
				builder.append(c);
			}
		}
	}
	
	private static int getParameterIndex(char[] chars, int index) {
		while (index < chars.length) {
			char c = chars[index];
			if (c == '}') {
				return index;
			} else if (c == '#' || c == '{') {
				throw new RuntimeException("sql 语句解析错误");
			} else {
				index++;
			}
		}
		throw new RuntimeException("sql 语句解析错误,缺少}号");
	}
	
	
	

	@Deprecated
	public static void setParamValues(PreparedStatement ps, MapperStatement mapperStatement, Object[] args) {
		String rawSql = mapperStatement.getSql();
		
		SortedMap<Integer, String> paramNames = mapperStatement.getParamIndexToName();
		
		
		char[] chars = rawSql.toCharArray();
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < chars.length; i++) {
			char c = chars[i];
			if (c == '#' && chars[i + 1] == '{') {
				i += 2;  // 移动到 { 后面去
				int paramEndIndex = getParameterIndex(chars, i);
				
				String paramName = rawSql.substring(i, paramEndIndex).trim();
				
				// 得到参数的名字  ，如果参数名中含有 . 符号 则用点之前的名字作为对象，  . 之后的名字作为成员变量 取值
				// 特殊情况是： 如果参数只有1个，则不管 点之前的名字，直接用 . 之后的名字作为成员变量 取值
				
				// 直接取参数值   ，  从参数对象的成员属性取值 ( 有. 的情况下)
				
				if (paramNames.containsValue(paramName)) {
				
				}
				
				
				// builder.append(" ? ");
				
			} else {
				builder.append(c);
			}
		}
		
		
	}
	
}
